/**
 * 给定N个盒子，初始每个盒子里有一个颜色为Ci的小球，Q次操作：
 * 每次操作将a盒里的球放入b盒，然后问b盒不同颜色的数量
 * 启发式合并，每次总是将数量少的放到数量多的，O(NlogN)
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using llt = long long;

int N, Q;
vector<set<int>> C;

int proc(int a, int b){
    auto & va = C[a];
    auto & vb = C[b];
    if(va.size() <= vb.size()){
        for(auto c : va) vb.insert(c);
        va.clear();
    }else{
        for(auto c : vb) va.insert(c);
        vb.clear();
        va.swap(vb);
    }
    return vb.size();
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    cin >> N >> Q;
    C.assign(N + 1, {});
    for(int c,i=1;i<=N;++i) {cin >> c; C[i].insert(c);}
    for(int a,b,i=0;i<Q;++i){
        cin >> a >> b;
        cout << proc(a, b) << endl;
    } 
    return 0;
}